#ifndef __VTOR_MENU_H
#define __VTOR_MENU_H

#ifdef __cplusplus
extern "C" {
#endif

#include "vtor_elec_module_config.h"

#ifdef __VTOR_MENU__

// 菜单名最长字符个数
#define	VTOR_MENU_CONFIG_ITEM_NAME_LEN	20

// 使能从列表项回到开头，和开头的前一项是结尾
// #define	VTOR_MENU_CONFIG_ROLLBACK

#define	VTOR_MENU_OPERATE_NULL			0
#define	VTOR_MENU_OPERATE_ENTER			1
#define	VTOR_MENU_OPERATE_CLICK			3

#define	VTOR_MENU_OPERATE_CHANGE_MENU	6
#define	VTOR_MENU_OPERATE_SELECT_MENU	7
#define	VTOR_MENU_OPERATE_CHANGE_VALUE	8
#define	VTOR_MENU_OPERATE_SET_VALUE		9

#define VtorMenuLayer(layer)	(VtorMenu*)layer
#define VtorMenuLayer0			(VtorMenu*)0
#define VtorMenuLayer1			(VtorMenu*)1
#define VtorMenuLayer2			(VtorMenu*)2
#define VtorMenuLayer3			(VtorMenu*)3
#define VtorMenuLayer4			(VtorMenu*)4
#define VtorMenuLayer5			(VtorMenu*)5

typedef struct VtorMenuStruct
{
	uint8_t menuName[VTOR_MENU_CONFIG_ITEM_NAME_LEN]; // 当前名
	int32_t menuValue; // 每个菜单下只有1个值，同时显示
	struct VtorMenuStruct* parentMenu; // 父项
	struct VtorMenuStruct* childMenu; // 子项
	struct VtorMenuStruct* prevMenu; // 兄项
	struct VtorMenuStruct* nextMenu; // 弟项
}VtorMenu;

extern VtorMenu* VtorMenu_curMenu;
extern VtorMenu* VtorMenu_rootMenu;
extern uint8_t VtorMenu_changeValueFlag;


void VtorMenu_Display(void);
void VtorMenu_Tree(VtorMenu* menu); // 使用树形打印结构，便于分析
void VtorMenu_PreProcess(void); // 预处理，主要是给菜单项赋值
void VtorMenu_ReProcess(void); // 再处理，主要是将菜单项的值赋值给变量
void VtorMenu_Operate(uint8_t OperataType, int32_t opValue); // 用于实现用户操作
void VtorMenu_Relate(VtorMenu* menu, VtorMenu* subMenu);
void VtorMenu_RelateByParentValue(VtorMenu* rootMenu); // 使用父指针智能构建树

// 用户实现并调用，初始化树形菜单
void VtorMenu_Init(void);
// 用户实现并调用，完成单个菜单项的显示
void VtorMenu_DisplaySingleMenu(uint8_t itemIdx, VtorMenu* menu);
// 用户自行实现，vtormenu自动调用，单个菜单项的点击回调函数
void VtorMenu_ClickHandler(VtorMenu* menu);
void VtorMenu_EnterCallback(VtorMenu* menu);

#endif // __VTOR_MENU__

#ifdef __cplusplus
}
#endif

#endif
